﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ProyectoTerminalRetiro.Models;
using LibParametros;
using LibConexionBD;
using ProyectoTerminalRetiro.Clases;
using System.Data.Entity.Validation;
using ProyectoTerminalRetiro.ReferenciaServicioEmpresa;

namespace ProyectoTerminalRetiro.Controllers.AdmEmpresaDestino
{
    public class EmpresaController : Controller
    {

        #region "Atributos"

        private ContextoDatos db = new ContextoDatos();

        #endregion

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }


        #region "Metodos privados"

        private bool estanVaciosLosCamposDeLaEmpresa(Empresa empresa)
        {
            if (empresa != null)
            {
                return ((string.IsNullOrEmpty(empresa.Codigo)) || (string.IsNullOrEmpty(empresa.Nombre)));
            }
            else return true;

        }


        private void LlenarRespuestaAlDarAltaEmpresa(Solicitud solicitud, Respuesta respuestaADevolver)
        {
            ReferenciaServicioEmpresa.ServiceClient servicioEmpresa = new ServiceClient();
            if ( servicioEmpresa.ObtenerEmpresaConCodigo(solicitud.Empresa.Codigo) != null )
            {
                respuestaADevolver.Mensaje = "Ya existe la empresa con el codigo " + request.Empresa.Codigo;
                return;
            }

            this.Create(solicitud.Empresa);
            Empresa empresaEnDb = servicioEmpresa.ObtenerEmpresaConCodigo(solicitud.Empresa.Codigo);
            respuestaADevolver.AgregarEmpresaALaRespuesta(empresaEnDb);
            respuestaADevolver.Mensaje = "La empresa se guardo correctamente";
        }


        private void LlenarRespuestaAlEditarEmpresa(Solicitud solicitud, Respuesta respuesta)
        {
            ReferenciaServicioEmpresa.ServiceClient servicio = new ServiceClient();

            if ( servicio.ExisteEmpresaConCodigoYconIdDiferente(solicitud.Empresa.Codigo, solicitud.Empresa.Id) )
            {
                respuesta.Mensaje = "Ya existe la empresa con el codigo " + solicitud.Empresa.Codigo;
                return;
            }

            this.Edit(solicitud.Empresa);
            respuesta.Mensaje = "La empresa se guardo correctamente";
            respuesta.AgregarEmpresaALaRespuesta(solicitud.Empresa);
            
        }


        private static Respuesta ArmarRespuestaConTodoLoNecesarioParaMostrarLosMicros(int id)
        {
            ReferenciaServicioEmpresa.ServiceClient servicioEmpresa = new ServiceClient();
            ReferenciaServicioMicro.ServiceClient servicioMicro = new ReferenciaServicioMicro.ServiceClient();

            ConsultorMicro consultorMicro = new ConsultorMicro();
            ConsultorDestino consultorDestino = new ConsultorDestino();
            Respuesta respuestaADevolver = new Respuesta();

            List<Micro> microsADevolver = consultorMicro.ObtenerMicrosDelaEmpresaConId(id);
            Empresa empresaADevolver = consultorEmpresarial.ObtenerEmpresaConId(id);
            List<Destino> todosLosDestinos = consultorDestino.ObtenerTodosLosDestinos();

            respuestaADevolver.AgregarEmpresaALaRespuesta(empresaADevolver);
            respuestaADevolver.SetearMicros(microsADevolver);
            respuestaADevolver.SetarDestinos(todosLosDestinos);
            return respuestaADevolver;
        }


        #endregion


        #region "Metodos publicos"
        //
        // GET: /Empresa/

        public ActionResult Index()
        {
            ReferenciaServicioEmpresa.ServiceClient servicio = new ReferenciaServicioEmpresa.ServiceClient();

            ReferenciaServicioEmpresa.Empresa[] empresas = servicio.ObtenerTodasLasEmrpesas();

            return View(empresas);
            


            //return View(db.Empresas.ToList());
        }

        //
        // GET: /Empresa/Details/5

        public ActionResult Details(int id = 0)
        {
            Empresa empresa = db.Empresas.Find(id);
            if (empresa == null)
            {
                return HttpNotFound();
            }
            return View(empresa);
        }

        //
        // GET: /Empresa/Create

        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: /Empresa/Create

        [HttpPost]
        public ActionResult Create(Empresa empresa)
        {
            if (ModelState.IsValid)
            {
                db.Empresas.Add(empresa);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(empresa);
        }

        //
        // GET: /Empresa/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Empresa empresa = db.Empresas.Find(id);
            if (empresa == null)
            {
                return HttpNotFound();
            }
            return View(empresa);
        }

        //
        // POST: /Empresa/Edit/5

        [HttpPost]
        public ActionResult Edit(Empresa empresa)
        {
            if (ModelState.IsValid)
            {
                db.Entry(empresa).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(empresa);
        }

        //
        // GET: /Empresa/Delete/5

        public ActionResult Delete(int id = 0)
        {
            Empresa empresa = db.Empresas.Find(id);
            if (empresa == null)
            {
                return HttpNotFound();
            }
            return View(empresa);
        }

        //
        // POST: /Empresa/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Empresa empresa = db.Empresas.Find(id);
            db.Empresas.Remove(empresa);
            db.SaveChanges();
            return RedirectToAction("Index");
        }



        public ActionResult DalAtlaEmpresa(Solicitud solicitud)
        {
            Respuesta respuestaADevolver = new Respuesta();
            if (estanVaciosLosCamposDeLaEmpresa(solicitud.Empresa))
            {
                respuestaADevolver.Mensaje = "No debe haber campos vacios";
                return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
            }

            LlenarRespuestaAlDarAltaEmpresa(solicitud, respuestaADevolver);
            return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
        }



        public ActionResult EditarEmpresa(Solicitud solicitud)
        {
            Respuesta respuestaADevolver = new Respuesta();
            if (estanVaciosLosCamposDeLaEmpresa(solicitud.Empresa))
            {
                respuestaADevolver.Mensaje = "No debe haber campos vacios";
                return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
            }
            LlenarRespuestaAlEditarEmpresa(solicitud, respuestaADevolver);
            return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
        }


        public ActionResult EliminarEmpresa(Solicitud solicitud)
        {
            Respuesta respuestaADevolver = new Respuesta();
            ReferenciaServicioEmpresa.ServiceClient servicio = new ServiceClient();

            if ( servicio.ObtenerEmpresaConId(solicitud.Empresa.Id) == null )
            {
                respuestaADevolver.Mensaje = "Nada para borrar: la empresa no existia";
                return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
            }

            Empresa empresaEnDb = servicio.ObtenerEmpresaConId(solicitud.Empresa.Id);
            this.DeleteConfirmed(solicitud.Empresa.Id);
            respuestaADevolver.Mensaje = "La empresa se borro correctamente";
            respuestaADevolver.AgregarEmpresaALaRespuesta(empresaEnDb);

            return Json(respuestaADevolver, JsonRequestBehavior.AllowGet);
        }


        public ActionResult AdministrarMicros(int id = 0)
        {
            Respuesta respuestaADevolver = ArmarRespuestaConTodoLoNecesarioParaMostrarLosMicros(id);
            return View(respuestaADevolver);
        }


        #endregion

    }
}